package dao;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import business.Utilisateur;


public class DaoAmitie {
	/* ------------------------------------------------ REQUETES PRECOMPILEES */
	private static CallableStatement statementGetAmis = null;
	private static CallableStatement statementGetDemandesAmiFaites = null;
	private static CallableStatement statementGetDemandesAmiRecues = null;
	private static CallableStatement statementDemanderAmi = null;
	private static CallableStatement statementAccepterAmi = null;
	private static CallableStatement statementRefuserAmi = null;
	private static CallableStatement statementSupprimerAmi = null;


	/* --------------------------------------------------------- CONSTRUCTEUR */
	static {
		try {
			statementGetAmis = DbConnection.getInstance().prepareCall("{call getAmis(?)}");
			statementGetDemandesAmiFaites = DbConnection.getInstance().prepareCall("{call getDemandesAmiFaites(?)}");
			statementGetDemandesAmiRecues = DbConnection.getInstance().prepareCall("{call getDemandesAmiRecues(?)}");
			statementDemanderAmi = DbConnection.getInstance().prepareCall("{call demanderAmi(?, ?)}");
			statementAccepterAmi = DbConnection.getInstance().prepareCall("{call accepterAmi(?, ?)}");
			statementRefuserAmi = DbConnection.getInstance().prepareCall("{call refuserAmi(?, ?)}");
			statementSupprimerAmi = DbConnection.getInstance().prepareCall("{call supprimerAmi(?, ?)}");
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
	}


	/* -------------------------------------------------------------- METHODE */
	public static List<Utilisateur> getAmis(int id_utilisateur) {
		List<Utilisateur> amis = null;
		
		try {
			ResultSet rs = null;
			
			synchronized(statementGetAmis) {
				statementGetAmis.setInt(1, id_utilisateur);
				
				rs = statementGetAmis.executeQuery();
			}
			
			if(rs != null) {
				amis = new ArrayList<Utilisateur>();
				
				while(rs.next()) {
					double ratio = rs.getInt("nbParisTotal") > 0 ? ((double) rs.getInt("nbParisJustes")) / rs.getInt("nbParisTotal") : 0.0;
					amis.add(new Utilisateur(
							rs.getInt("id_utilisateur"),
							rs.getString("mail"),
							rs.getString("pseudo"),
							null, // motDePasse
							rs.getInt("points"),
							rs.getInt("score"),
							rs.getInt("nbParisJustes"),
							rs.getInt("nbParisTotal"),
							ratio));
				}
			}
		}
		catch(SQLException e) {
			e.printStackTrace();
		}
		
		return amis;
	}


	public static List<Utilisateur> getDemandesAmiFaites(int id_utilisateur) {
		List<Utilisateur> amis = null;
		
		try {
			ResultSet rs = null;
			
			synchronized(statementGetDemandesAmiFaites) {
				statementGetDemandesAmiFaites.setInt(1, id_utilisateur);
				
				rs = statementGetDemandesAmiFaites.executeQuery();
			}
			
			if(rs != null) {
				amis = new ArrayList<Utilisateur>();
				
				while(rs.next()) {
					double ratio = rs.getInt("nbParisTotal") > 0 ? ((double) rs.getInt("nbParisJustes")) / rs.getInt("nbParisTotal") : 0.0;
					amis.add(new Utilisateur(
							rs.getInt("id_utilisateur"),
							rs.getString("mail"),
							rs.getString("pseudo"),
							null, // motDePasse
							rs.getInt("points"),
							rs.getInt("score"),
							rs.getInt("nbParisJustes"),
							rs.getInt("nbParisTotal"),
							ratio));
				}
			}
		}
		catch(SQLException e) {
			e.printStackTrace();
		}
		
		return amis;
	}


	public static List<Utilisateur> getDemandesAmiRecues(int id_utilisateur) {
		List<Utilisateur> amis = null;
		
		try {
			ResultSet rs = null;
			
			synchronized(statementGetDemandesAmiRecues) {
				statementGetDemandesAmiRecues.setInt(1, id_utilisateur);
				
				rs = statementGetDemandesAmiRecues.executeQuery();
			}
			
			if(rs != null) {
				amis = new ArrayList<Utilisateur>();
				
				while(rs.next()) {
					double ratio = rs.getInt("nbParisTotal") > 0 ? ((double) rs.getInt("nbParisJustes")) / rs.getInt("nbParisTotal") : 0.0;
					amis.add(new Utilisateur(
							rs.getInt("id_utilisateur"),
							rs.getString("mail"),
							rs.getString("pseudo"),
							null, // motDePasse
							rs.getInt("points"),
							rs.getInt("score"),
							rs.getInt("nbParisJustes"),
							rs.getInt("nbParisTotal"),
							ratio));
				}
			}
		}
		catch(SQLException e) {
			e.printStackTrace();
		}
		
		return amis;
	}


	/* -------------------------------------------------------------- METHODE */
	public static boolean demanderAmi(int id_demandeur, int id_cible) {
		try {
			synchronized(statementDemanderAmi) {
				statementDemanderAmi.setInt(1, id_demandeur);
				statementDemanderAmi.setInt(2, id_cible);
				
				statementDemanderAmi.execute();
			}
		}
		catch(SQLException e) {
			e.printStackTrace();
			
			return false;
		}
		
		return true;
	}


	public static boolean accepterAmi(int id_cible, int id_demandeur) {
		try {
			synchronized(statementAccepterAmi) {
				statementAccepterAmi.setInt(1, id_cible);
				statementAccepterAmi.setInt(2, id_demandeur);
				
				statementAccepterAmi.execute();
			}
		}
		catch(SQLException e) {
			e.printStackTrace();
			
			return false;
		}
		
		return true;
	}


	public static boolean refuserAmi(int id_cible, int id_demandeur) {
		try {
			synchronized(statementRefuserAmi) {
				statementRefuserAmi.setInt(1, id_cible);
				statementRefuserAmi.setInt(2, id_demandeur);
				
				statementRefuserAmi.execute();
			}
		}
		catch(SQLException e) {
			e.printStackTrace();
			
			return false;
		}
		
		return true;
	}


	public static boolean supprimerAmi(int id_demandeur, int id_cible) {
		try {
			synchronized(statementSupprimerAmi) {
				statementSupprimerAmi.setInt(1, id_demandeur);
				statementSupprimerAmi.setInt(2, id_cible);
				
				statementSupprimerAmi.execute();
			}
		}
		catch(SQLException e) {
			e.printStackTrace();
			
			return false;
		}
		
		return true;
	}
}
